home *** CD-ROM | disk | FTP | other *** search
/ Floppyshop 2 / Floppyshop - 2.zip / Floppyshop - 2.iso / diskmags / 0022-3.564 / dmg-3323 / protocol.gem / gfa / acc_500.gfa (.txt) < prev    next >
GFA-BASIC Atari  |  1987-04-21  |  16KB  |  522 lines

  1. '
  2. $m 15000
  3. ' ACC 500
  4. ' Accessoire permettant le pilotage d'autres applications
  5. ' Les équivalences issues du fichier ressource
  6. ' resource set indicies for ACC_500 */
  7. tube&=0         !form/dialog
  8. cadtube&=0      ! BOX in tree TUBE
  9. tube1&=4        ! BUTTON in tree TUBE
  10. tube2&=5        ! BUTTON in tree TUBE
  11. tube3&=6        ! BUTTON in tree TUBE
  12. tube4&=7        ! BUTTON in tree TUBE
  13. tube5&=8        ! BUTTON in tree TUBE
  14. annutube&=9     ! BUTTON in tree TUBE
  15. nexttube&=10    ! BUTTON in tree TUBE
  16. '
  17. my_menu$="  ACC500/GFA" ! titre du menu de cet ACC
  18. ' Les définitions des alertes
  19. alert1$="[1][Accessoire de pilotage (GFA)|Compatible Protocole Tube GEM|Lancement du pilotage ?][Oui|Non]"
  20. alert2$="[1][Choisissez la séquence|qui va être envoyée...][1|2|3]"
  21. alert3$="[1][Notre correspondant|abandonne la communication][OK]"
  22. alert4$="[1][ACC500/GFA|Fichier ressource introuvable|(ACC_500.RSC)][End]"
  23. ' Alertes pour le Tube GEM. Attention, il n'y a ici que les textes
  24. ' pour les alertes de la série 500 !
  25. alerte_tub1$="[1][Tableau endommagé, |communication par le|Tube GEM impossible.][ OK ]"
  26. alerte_tub2$="[1][Pas d'autres applications|pour l'échange de données][OK]"
  27. alerte_tub2bis$="[1][Pas d'autres applications|pilotables. Désolé...][OK]"
  28. alerte_tub3$="[1][Probléme en $5A0 |Communication par le|Tube GEM impossible][ OK ]"
  29. ' Préparons les buffers
  30. DIM new_jar%(31)        ! pour Cookie-Jar
  31. DIM tab_tub&(13)        ! pour tableau Protocole
  32. DIM messagebuf&(7)      ! pour émettre ou recevoir les messages
  33. DIM tab_okapid&(9)      ! pour Choice
  34. '
  35. app_id&=APPL_INIT()     ! je demande mon identificateur d'application
  36. IF RSRC_LOAD("\ACC_500.RSC")=0
  37.   ~FORM_ALERT(1,alert4$)
  38.   END                   ! dur avec un ACC mais enfin...
  39. ENDIF
  40. ~MENU_REGISTER(app_id&,my_menu$)        ! place mon nom dans le menu
  41. ' Mise en place du détournement de reset (Cookie-Jar STF)
  42. @put_reset      ! deux routines à utiliser à chaque fois,
  43. @init_tube_acc  ! et donc à mettre en bibliothéque
  44. '
  45. ' Et nous commençons la grande attente !
  46. DO
  47.   ~EVNT_MESAG(VARPTR(messagebuf&(0)))    ! attente des messages...
  48.   SELECT messagebuf&(0)
  49.   CASE 40                             ! ouverture de l'accessoire
  50.     @open_acc                         ! allons le gérer
  51.   CASE 300                            ! demande si compatible 300
  52.     @send_message(messagebuf&(1),301) ! je répond non (301)
  53.   CASE 400                            ! demande si compatible 400
  54.     @send_message(messagebuf&(1),401) ! je répond non (401)
  55.   CASE 500                            ! demande si compatible 500
  56.     @send_message(messagebuf&(1),501) ! je répond non (501)
  57.   ENDSELECT
  58. LOOP
  59. '
  60. ' Ouverture de l'accessoire. Recherche et vérification du tableau
  61. ' des APP_ID à cause d'une destruction toujours possible
  62. > PROCEDURE open_acc
  63.   LOCAL action&,adr_action%
  64.   action&=FORM_ALERT(1,alert1$)
  65.   IF action&=1
  66.     @find_apid
  67.     IF a0%<>0
  68.       @choice_tube(500) !cherche correspondant pour messages 500
  69.       IF d0&<>-1
  70.         ' Nous avons notre correpondant, quelle séquence lui envoyer ?
  71.         action&=FORM_ALERT(1,alert2$)
  72.         @charge_commande
  73.         REPEAT
  74.           ' Envoyons le message avec les ordres
  75.           messagebuf&(0)=506
  76.           messagebuf&(1)=app_id&
  77.           messagebuf&(2)=0
  78.           LPOKE VARPTR(messagebuf&(3)),adr_action%
  79.           messagebuf&(5)=0
  80.           messagebuf&(6)=0
  81.           messagebuf&(7)=0
  82.           ~APPL_WRITE(d0&,16,VARPTR(messagebuf&(0)))
  83.           REPEAT
  84.             ~EVNT_MESAG(VARPTR(messagebuf&(0)))
  85.           UNTIL messagebuf&(0)=505 OR messagebuf&(0)=507 OR messagebuf&(0)=509
  86.         UNTIL messagebuf&(0)<>507    ! cas de demande de répétition
  87.         ' Réagissons suivant la réponse
  88.         SELECT messagebuf&(0)
  89.         CASE 505     ! Transmission d'ordres terminée, nous prévenons
  90.           @send_message(d0&,508)
  91.         CASE 509     ! abandon de notre correspondant...
  92.           ~FORM_ALERT(1,alert3$)
  93.         ENDSELECT
  94.       ENDIF
  95.     ENDIF
  96.   ENDIF
  97. RETURN
  98. > PROCEDURE charge_commande
  99.   ' Cette procédure charge dans une chaine les ordres
  100.   ' qui seront envoyés à l'application à piloter
  101.   SELECT action&
  102.   CASE 1
  103.     RESTORE seq1
  104.   CASE 2
  105.     RESTORE seq2
  106.   CASE 3
  107.     RESTORE seq3
  108.   ENDSELECT
  109.   ' 2000 octets de message, c'est bien suffisant!
  110.   adr_action%=GEMDOS(72,L:2000)
  111.   t%=adr_action%
  112.   DO
  113.     READ x&
  114.     DPOKE t%,x&
  115.     EXIT IF x&=-1
  116.     t%=t%+2
  117.     SELECT x&
  118.     CASE -2     ! le suivant est un paramétre sur 4 octets ?
  119.       READ x%   ! -2 est l'équivalent de &HFFFE, valeur impossible
  120.       LPOKE t%,x%       ! à affecter à x&
  121.       t%=t%+4
  122.     CASE -3     ! paramétre suivant sur 2 octets ?
  123.       READ x&   ! -3 c'est &HFFFD (même remarque)
  124.       DPOKE t%,x&
  125.       t%=t%+2
  126.     ENDSELECT
  127.   LOOP
  128. RETURN
  129. '
  130. ' Les procédures suivantes sont simplement à merger.
  131. ' Elles sont disponibles dans le dossier Biblio.
  132. > PROCEDURE init_tube_acc
  133.   '
  134.   ' Procédure d'initialisation pour accessoire
  135.   ' Fichier ACC_INIT.LST
  136.   '
  137.   cookie4&=0                    ! ne pas écraser
  138. init_tub0:
  139.   cookie1%=CVL("_TUB")          ! cookie recherché
  140.   cookie2%=VARPTR(new_jar%(0))  !
  141.   cookie3%=VARPTR(tab_tub&(0))
  142.   @cookie_jar
  143.   '
  144.   IF cookie2%<>0
  145.     IF cookie3%=VARPTR(tab_tub&(0))     ! si c'est ma liste
  146.       tab_tub&(0)=CVI("PR")     ! je met son en-tête
  147.       tab_tub&(1)=CVI("OT")
  148.       tab_tub&(2)=10      ! le nbd d'app_id quelle peut contenir
  149.       tab_tub&(3)=app_id& ! mon APP_ID
  150.       tab_tub&(4)=-1      ! et la marque de fin
  151.     ELSE
  152.       ' Vérifions le tableau Protocole en place...
  153.       IF LPEEK(cookie3%)<>CVL("PROT")
  154.         cookie4&=1      ! tableau invalide, nous
  155.         GOTO init_tub0  ! allons l'écraser...
  156.       ELSE
  157.         ' Parcourons le tableau en place pour placer
  158.         ' notre APP_ID et clore par &HFFFF
  159.         maxi&=DPEEK(cookie3%+4) ! nbr maxi d'app_id autorisés
  160.         cookie3%=cookie3%+6     ! saute l'en-tête
  161.         REPEAT
  162.           ' Nous prévoyons le cas d'ACC lancés par Multidesk
  163.           ' qui améne à avoir plusieurs fois le même APP_ID:
  164.           ' Si nous y trouvons déja le notre -> bye bye!!!
  165.           EXIT IF DPEEK(cookie3%)=app_id&
  166.           IF DPEEK(cookie3%)=&HFFFF     ! fin de la liste ?
  167.             DPOKE cookie3%,app_id&      ! donc met mon APPID
  168.             DPOKE cookie3%+2,&HFFFF     ! et l'indication de fin
  169.           ELSE
  170.             cookie3%=cookie3%+2         ! sinon passe à l'app_id
  171.             DEC maxi&                   ! suivant, et le compte
  172.           ENDIF
  173.         UNTIL DPEEK(cookie3%)=app_id& OR maxi&=0
  174.       ENDIF
  175.     ENDIF
  176.   ENDIF
  177. RETURN
  178. > PROCEDURE soufflage
  179.   '
  180.   ' L'application s'envoi un message et l'attend
  181.   ' Fichier SOUFLAGE.LST
  182.   '
  183.   @send_message(app_id&,-1)
  184.   REPEAT
  185.     ~EVNT_MESAG(VARPTR(messagebuf&(0)))    ! attente des messages...
  186.   UNTIL messagebuf&(0)=-1
  187. RETURN
  188. > PROCEDURE choice_tube(type_cherche&)
  189.   LOCAL cmp_apid&,temp%,adr_form%,x_tube%,y_tube%,w_tube%,h_tube%
  190.   LOCAL sortie!,dial_tube!,mono_flag&,action&,t&,d5&,d7&
  191.   LOCAL cmp_descrip&
  192.   '
  193.   ' Procédure destinée à permettre à l'utilisateur de choisir
  194.   ' L'application destinatrice. Il est tout a fiat possible
  195.   ' de présenter celles-ci d'une autre façons.
  196.   ' Fichier CHOICE.LST
  197.   '
  198.   a0%=a0%+6
  199.   temp%=a0%
  200.   sortie!=FALSE
  201.   dial_tube!=FALSE   ! pour le form_dial
  202.   cmp_descrip&=0   ! pour pointer dans tableau de descripteur
  203.   d5&=0            ! compteur d'APP_ID (par précaution...)
  204.   d7&=tube1&
  205.   mono_flag&=0     ! par défaut je suis seul
  206.   @soufflage
  207.   ~RSRC_GADDR(0,tube&,adr_form%)
  208.   ~FORM_CENTER(adr_form%,x_tube%,y_tube%,w_tube%,h_tube%)
  209.   @hide_all     ! procédure cachant tous les boutons
  210.   REPEAT
  211.     ' Le GFA permet un teste avec DPEEK et &hFFFF mais
  212.     ' pas t&=dpeek si le résultat donne &hFFFF !!!!
  213.     ' Si nous sommes à la fin ou si nous dépassons
  214.     IF DPEEK(temp%)=&HFFFF OR d5&>=(DPEEK(a0%-2))
  215.       temp%=a0%       ! remet temp% au début
  216.       d5&=0           ! et init le compteur d'APP_ID
  217.       IF d7&<>tube1&    ! si nous avons au moins rempli
  218.         @gere_formtub   ! le premier bouton...
  219.       ELSE
  220.         ' Nous sommes en fin de liste et nous ne nous sommes
  221.         ' même pas trouvé. Alerte et bye bye...
  222.         IF mono_flag&=0
  223.           d0&=-1
  224.           d1&=-1
  225.           sortie!=TRUE
  226.           IF jy_suis&=0     ! si théoriquement je suis dans la liste
  227.             ~FORM_ALERT(1,alert_tub1$)
  228.           ENDIF
  229.         ENDIF
  230.       ENDIF
  231.       '
  232.     ELSE
  233.       t&=DPEEK(temp%)   ! préléve l'app_id
  234.       INC d5&           ! le compte
  235.       temp%=temp%+2     ! et avance sur le prochain
  236.       ' Nous ne sommes pas à la fin de la liste des APP_ID
  237.       IF t&=app_id&     ! Si l'app_id actuel est le notre
  238.         IF mono_flag&=-1
  239.           ' Nous avons trouvé notre APP_ID mais d'aprés mono_flag
  240.           ' nous estimons être tout seul dans la liste !
  241.           d0&=-1
  242.           d1&=-1
  243.           sortie!=TRUE
  244.           IF type_cherche&=300
  245.             ~FORM_ALERT(1,alerte_tub2$)         ! je suis seul (300)
  246.           ELSE
  247.             ~FORM_ALERT(1,alerte_tub2bis$)      ! je suis seul (500)
  248.           ENDIF
  249.         ELSE
  250.           mono_flag&=-1     ! prévenons que nous nous sommes trouvé
  251.         ENDIF
  252.       ELSE      ! l'app_id actuel n'est pas le notre
  253.         messagebuf&(0)=type_cherche&
  254.         messagebuf&(1)=app_id&
  255.         messagebuf&(2)=0
  256.         messagebuf&(3)=0
  257.         messagebuf&(4)=0
  258.         messagebuf&(5)=0
  259.         messagebuf&(6)=0
  260.         messagebuf&(7)=0
  261.         ~APPL_WRITE(t&,16,VARPTR(messagebuf&(0)))
  262.         ' Attendons la réponse
  263.         REPEAT
  264.           action&=EVNT_MULTI(&X110000,0,0,0,0,0,0,0,0,0,0,0,0,0,VARPTR(messagebuf&(0)),500)
  265.         UNTIL (action&=&X10000 AND (messagebuf&(0)=(type_cherche&+1) OR messagebuf&(0)=(type_cherche&+3)) OR action&=&X100000)
  266.         '
  267.         ' si c'est une message 303 (ou 503) du bon correspondant
  268.         IF action&=&X10000 AND messagebuf&(0)=type_cherche&+3 AND messagebuf&(1)=t&
  269.           num_descrip&=0     ! réception du premier descripteur
  270.           act_apid&=messagebuf&(1)   ! de l'actuel correspondant
  271.           mono_flag&=-2     ! nous ne sommes pas seul
  272.           ' Nous cherchons l'adresse du bouton à remplir, et nous
  273.           ' le remplissons avec le descripteur du correspondant
  274.           a4%=LPEEK(VARPTR(messagebuf&(3)))     ! adresse descripteur
  275.           REPEAT
  276.             OB_SPEC(adr_form%,d7&)=a4%    ! place le texte dans le bouton
  277.             OB_FLAGS(adr_form%,d7&)=&H15  !selectable, exit et r_button
  278.             tab_okapid&(cmp_descrip&)=act_apid&     ! note l'APP_ID
  279.             tab_okapid&(cmp_descrip&+1)=num_descrip& ! et le descripteur
  280.             cmp_descrip&=cmp_descrip&+2
  281.             INC num_descrip&
  282.             INC d7&     ! on passe au bouton suivant
  283.             IF d7&>tube5&
  284.               @gere_formtub
  285.               EXIT IF sortie!=TRUE
  286.             ENDIF
  287.             a4%=a4%+34  ! saute 32 oct de texte + flag de fin
  288.           UNTIL DPEEK(a4%-2)=&HFF
  289.           '
  290.         ENDIF
  291.       ENDIF
  292.     ENDIF
  293.     '
  294.   UNTIL sortie!=TRUE
  295. RETURN
  296. > PROCEDURE gere_formtub
  297.   LOCAL ex%
  298.   IF dial_tube!=FALSE
  299.     ~FORM_DIAL(0,0,0,0,0,x_tube%,y_tube%,w_tube%,h_tube%)
  300.     dial_tube!=TRUE
  301.   ENDIF
  302.   ~OBJC_DRAW(adr_form%,0,10,x_tube%,y_tube%,w_tube%,h_tube%)
  303.   ex&=FORM_DO(adr_form%,0)
  304.   ' test du résultat de sortie
  305.   OB_STATE(adr_form%,ex&)=BCLR(OB_STATE(adr_form%,ex&),0)
  306.   SELECT ex&
  307.   CASE annutube&
  308.     d0&=-1
  309.     d1&=-1
  310.     sortie!=TRUE
  311.     ~FORM_DIAL(3,0,0,0,0,x_tube%,y_tube%,w_tube%,h_tube%)
  312.   CASE nexttube&
  313.     @hide_all           ! on cache tous les boutons (par défaut)
  314.     cmp_descrip&=0      ! premier emplacement du tableau ap_id et identf
  315.     d7&=tube1&          ! premier bouton du formulaire
  316.     sortie!=FALSE
  317.   DEFAULT
  318.     ' C'est un des boutons descriptifs
  319.     ex&=ex&-tube1&    ! pour avoir 0,1,2,3...
  320.     ex&=ex&*2         ! car les infos sont par couples
  321.     d0&=tab_okapid&(ex&)
  322.     d1&=tab_okapid&(ex&+1)
  323.     ~FORM_DIAL(3,0,0,0,0,x_tube%,y_tube%,w_tube%,h_tube%)
  324.     sortie!=TRUE
  325.   ENDSELECT
  326. RETURN
  327. > PROCEDURE hide_all
  328.   ' Par défaut nous cachons tous les boutons
  329.   OB_FLAGS(adr_form%,tube1&)=BSET(OB_FLAGS(adr_form%,tube1&),7)
  330.   OB_FLAGS(adr_form%,tube2&)=BSET(OB_FLAGS(adr_form%,tube2&),7)
  331.   OB_FLAGS(adr_form%,tube3&)=BSET(OB_FLAGS(adr_form%,tube3&),7)
  332.   OB_FLAGS(adr_form%,tube4&)=BSET(OB_FLAGS(adr_form%,tube4&),7)
  333.   OB_FLAGS(adr_form%,tube5&)=BSET(OB_FLAGS(adr_form%,tube5&),7)
  334. RETURN
  335. > PROCEDURE send_message(dest&,num&)
  336.   '
  337.   ' Pour envoyer un message à une autre application
  338.   ' Fichier SEND_MES.LST
  339.   '
  340.   messagebuf&(0)=num&           !numéro du message
  341.   messagebuf&(1)=app_id&        !mon identificateur d'application
  342.   messagebuf&(3)=0              !et tout le reste à 0
  343.   messagebuf&(4)=0
  344.   messagebuf&(5)=0
  345.   messagebuf&(6)=0
  346.   messagebuf&(7)=0
  347.   ~APPL_WRITE(dest&,16,VARPTR(messagebuf&(0)))
  348. RETURN
  349. > PROCEDURE find_apid
  350.   '
  351.   ' Recherche de la liste des APP_ID et retour de son
  352.   ' adresse dans la variable a0%
  353.   ' C'est une procédure commune aux ACCs et aux PRGs
  354.   ' Fichier TUBEFIND.LST
  355.   '
  356.   cookie1%=CVL("_TUB")
  357.   cookie2%=0
  358.   cookie3%=0
  359.   cookie4&=0
  360.   @cookie_jar
  361.   '
  362.   IF cookie2%=0 OR cookie3%=0
  363.     ~FORM_ALERT(1,alerte_tub3$)
  364.     a0%=0
  365.   ELSE
  366.     IF LPEEK(cookie3%)<>CVL("PROT")
  367.       ~FORM_ALERT(1,alerte_tub1$)
  368.       a0%=0
  369.     ELSE
  370.       a0%=cookie3%
  371.     ENDIF
  372.   ENDIF
  373. RETURN
  374. > PROCEDURE cookie_jar
  375.   '
  376.   ' Procédure permettant de lire et/ou d'écrire dans le Cookie-Jar.
  377.   ' Par simplification, il s'agit de la même routine pour ACC et PRG
  378.   ' alors qu'il aurait été possible d'en faire des différentes.
  379.   ' Fichier COOKIJAR.LST
  380.   '
  381.   LOCAL temp%,x%,cmp%
  382. cookie_jar0:
  383.   temp%=LPEEK(&H5A0)         !cherche adresse cookie-jar
  384.   ' S'il n'y a pas de boite, nous plaçons la notre
  385.   IF temp%=0
  386.     IF cookie2%<>0              ! si nous avons une boite à mettre...
  387.       SLPOKE &H5A0,cookie2%      ! adresse de celle-ci
  388.       IF cookie1%<>0            ! si nous avons un cookie...
  389.         LPOKE cookie2%,cookie1%
  390.         LPOKE cookie2%+4,cookie3%
  391.         LPOKE cookie2%+8,0
  392.         LPOKE cookie2%+12,16
  393.       ENDIF
  394.     ENDIF
  395.   ELSE     ! Il y a un Cookie-Jar
  396.     IF cookie1%<>0      ! si nous devons chercher un gateaux
  397.       cmp%=0                      ! init. compteur de Cookie
  398.       REPEAT
  399.         x%=LPEEK(temp%)           ! préléve l'identif. d'un cookie
  400.         temp%=temp%+8             ! avance sur le suivant
  401.         INC cmp%                  ! et compte ce cookie
  402.       UNTIL x%=0 OR x%=cookie1%
  403.       temp%=temp%-4               !reculons sur l'info. de ce cookie
  404.       ' Si nous avons trouvé notre cookie1
  405.       IF x%=cookie1%
  406.         IF cookie4&=0   ! si nous devons juste noter l'information,
  407.           cookie3%=LPEEK(temp%)     ! nous la notons et bye bye...
  408.         ELSE
  409.           LPOKE temp%,cookie3%      ! sinon nous la forçons
  410.         ENDIF
  411.       ELSE
  412.         ' Nous avons trouvé la fin de la boite, nous mettons
  413.         ' notre cookie, s'il reste de la place...
  414.         IF LPEEK(temps%)=0      ! précaution si nbr de slot nul,
  415.           SLPOKE &H5A0,0         ! la boite est mauvaise...
  416.           GOTO cookie_jar0
  417.         ENDIF
  418.         IF cookie3%<>0  ! si nous avons quelque chose à mettre
  419.           IF cmp%<LPEEK(temp%)             ! s'il reste de la place...
  420.             LPOKE (temp%+4),0               ! flag de fin
  421.             LPOKE (temp%+8),LPEEK(temp%)    ! transfert le nbr d'emplacement
  422.             LPOKE (temp%-4),cookie1%        ! place l'identif. de notre cookie
  423.             LPOKE (temp%),cookie3%          ! et sa valeur d'info
  424.           ELSE
  425.             ' Il n'y a pas assez de place: plaçons une plus grosse boite
  426.             IF cmp%<16 AND cookie2%<>0      ! si nous pouvons...
  427.               temp%=LPEEK(&H5A0)        ! adr ancien cookie-jar
  428.               SLPOKE &H5A0,cookie2%      ! note adr du nouveau
  429.               WHILE LPEEK(temp%)<>0
  430.                 LPOKE cookie2%,LPEEK(temp%)
  431.                 LPOKE cookie2%+4,LPEEK(temp%+4)
  432.                 temp%=temp%+8
  433.                 cookie2%=cookie2%+8
  434.               WEND
  435.               LPOKE (cookie2%),cookie1%
  436.               LPOKE (cookie2%+4),cookie3%
  437.               LPOKE (cookie2%+8),0
  438.               LPOKE (cookie2%+12),16
  439.             ELSE
  440.               ' Boite pas assez grosse ou pas de boite à mettre ...
  441.               cookie3%=0
  442.             ENDIF
  443.           ENDIF
  444.         ENDIF
  445.       ENDIF
  446.     ENDIF
  447.   ENDIF
  448.   cookie2%=LPEEK(&H5A0)
  449. RETURN
  450. > PROCEDURE put_reset
  451.   '
  452.   ' Procédure pour détourner le reset et y placer une routine
  453.   ' effaçant le contenu de $5A0 (cas d'un Cookie-Jar de STF)
  454.   ' Fichier RESET.LST
  455.   '
  456.   RESTORE asm_data
  457.   DO
  458.     READ code$
  459.     EXIT IF code$="FIN"
  460.     code$="&H"+code$
  461.     code%=VAL(code$)
  462.     asm$=asm$+MKI$(code%)
  463.   LOOP
  464.   asm%=VARPTR(asm$)
  465.   LPOKE asm%+8,LPEEK(&H426)           ! prend ancien magique
  466.   LPOKE asm%+18,LPEEK(&H42A)          ! prend ancienne routine
  467.   SLPOKE &H426,&H31415926       ! magique reset
  468.   SLPOKE &H42A,asm%
  469. RETURN
  470. asm_data:
  471. DATA 42B9,0000,05A0
  472. DATA 23FC,0000,0000,0000,0426
  473. DATA 23FC,0000,0000,0000,042A
  474. DATA 4ED6,FIN
  475. '
  476. seq1:
  477. DATA 4,2
  478. DATA 6,-3,2,-3,9
  479. DATA 0,-3,75,-3,75,-3,25
  480. DATA 0,-3,120,-3,120,-3,25
  481. DATA 6,-3,2,-3,3
  482. DATA 0,-3,200,-3,200,-3,25
  483. DATA 0,-3,300,-3,300,-3,25
  484. DATA 3,-2,1000
  485. DATA 1,-3,25,-3,25,-3,45,-3,45
  486. DATA 6,-3,1,-3,0
  487. DATA 5,-1
  488. '
  489. seq2:
  490. DATA 4,2
  491. DATA 6,-3,2,-3,15
  492. DATA 1,-3,25,-3,25,-3,75,-3,75
  493. DATA 3,-2,1000
  494. DATA 6,-3,2,-3,16
  495. DATA 1,-3,150,-3,25,-3,200,-3,45
  496. DATA 3,-2,1000
  497. DATA 6,-3,2,-3,17
  498. DATA 1,-3,25,-3,150,-3,45,-3,200
  499. DATA 3,-2,1000
  500. DATA 6,-3,2,-3,18
  501. DATA 1,-3,300,-3,300,-3,350,-3,350
  502. DATA 3,-2,1000
  503. DATA 6,-3,2,-3,19
  504. DATA 1,-3,45,-3,45,-3,65,-3,65
  505. DATA 3,-2,1000
  506. DATA 6,-3,1,-3,0
  507. DATA 5,-1
  508. '
  509. seq3:
  510. DATA 4,2
  511. DATA 6,-3,2,-3,15
  512. DATA 0,-3,100,-3,100,-3,25
  513. DATA 1,-3,25,-3,25,-3,45,-3,45
  514. DATA 0,-3,160,-3,100,-3,25
  515. DATA 1,-3,25,-3,250,-3,45,-3,270
  516. DATA 6,-3,2,-3,2
  517. DATA 0,-3,100,-3,160,-3,25
  518. DATA 1,-3,250,-3,225,-3,230,-3,250
  519. DATA 0,-3,160,-3,160,-3,25
  520. DATA 6,-3,1,-3,0
  521. DATA 5,-1
  522.